package cn.jingyuan.bee.utils.map;

import java.util.Map;

/**
 * 自定义键的 Map，默认 HashMap 实现
 *
 * @param <K> 键类型
 * @param <V> 值类型
 */
public abstract class CustomKeyMap<K, V> extends MapWrapper<K, V> {

    /**
     * 构造<br>
     * 通过传入一个 Map 从而确定 Map 的类型，子类需创建一个空的 Map，而非传入一个已有 Map，否则值可能会被修改
     *
     * @param m Map 被包装的 Map
     */
    public CustomKeyMap(Map<K, V> m) {
        super(m);
    }

    @Override
    public V get(Object key) {
        return super.get(customKey(key));
    }

    @Override
    public V put(K key, V value) {
        return super.put((K) customKey(key), value);
    }

    @Override
    public void putAll(Map<? extends K, ? extends V> m) {
        for (Entry<? extends K, ? extends V> entry : m.entrySet()) {
            this.put(entry.getKey(), entry.getValue());
        }
    }

    @Override
    public boolean containsKey(Object key) {
        return super.containsKey(customKey(key));
    }

    /**
     * 自定义键
     *
     * @param key KEY
     *
     * @return 自定义 KEY
     */
    protected abstract Object customKey(Object key);

}
